<?php
require './function.php';
/**
 * @Author: Wherein
 * @Date: 2021-04-11 11:14
 * @Descripttion: 模板模式
 * @example 一个银行可以有许多不同类型的银行账户，但是所有账户的处理方式基本相同。假设我们现在有两类账户，一类是普通账户，一类是信用卡账户。现在进行支付，信用卡允许透支，普通账户不允许透支，即账户金额不允许小于零
 */

abstract class Template
{
    protected $balance = 100;
    // 结算方法
    abstract protected function adjust($num);
    // 支付信息显示
    abstract protected function display($num);
    final public function apply($num)
    {
        $this->adjust($num);
        $this->display($num);
    }
}

// 普通账户
class Account extends Template{
    protected $falg; // 用于判断支付是否成功
    protected function adjust($num){
        if ($this->balance > $num) {
            $this->balance -= $num;
            $this->falg = true;
        } else {
            $this->falg = false;
        }
    }
    protected function display($num)
    {
        if ($this->falg){
            dd('支付成功, 所剩余额为:'. $this->balance);
        } else {
            dd('余额不足,支付失败,所剩余额为 ' . $this->balance);
        }
    }
}

// 信用卡用户
class Credit extends Template{
    protected function adjust($num)
    {
        $this->balance -= $num;
    }
    protected function display($num)
    {
        dd('感谢您使用信用支付, 所剩余额为 ' . $this->balance);
    }
}

// 普通用户
$account = new Account;
// 普通账户使用
$account->apply(80);
// 透支
$account->apply(30);

// 信用卡账户使用
$credit = new Credit;
$credit->apply(200);